package com.demo.service1.controller;

import com.google.common.collect.Maps;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;

/**
 * @author 夜曲sin
 * @create 2021/6/23
 */
@RestController
@RequestMapping("/test")
//@RefreshScope
public class TestController {
    /*
        【说明】
        1、使用@Value()注解获取配置信息时，如果配置发生变化，虽然nacos服务器会通知到客户端，但这里使用@Value注入的配置并不会变成最新的！

        2、在类上添加@RefreshScope注解可以使@Value()注入的配置获取到变化后的值！
            @RefreshScope注解说明：
            - 所有@RefreshScope的Bean都是延迟加载的，只有在第一次访问时才会初始化
            - 刷新Bean也是同理，下次访问时会创建一个新的对象

        3、使用ConfigurableApplicationContext.getEnvironment().getProperty("key")可以获取到变化后的配置！！

     */
    @Value("${common.name}")
    private String name;

    @Autowired
    private ConfigurableApplicationContext applicationContext;

    @GetMapping("/name")
    public String name() {
        // 查看从nacos拉取到的配置：http://localhost:56010/test/name
        return name;
    }

    @GetMapping("/name2")
    public String name2() {
        // 可以获取到最新的配置
        return applicationContext.getEnvironment().getProperty("common.name");
    }

    @GetMapping("/extConfig")
    public HashMap<String, Object> extConfig() {
        // 获取扩展配置
        HashMap<String, Object> map = Maps.newHashMap();
        map.put("config1.name", applicationContext.getEnvironment().getProperty("config1.name"));
        map.put("config2.name", applicationContext.getEnvironment().getProperty("config2.name"));
        map.put("config3.name", applicationContext.getEnvironment().getProperty("config3.name"));
        return map;
    }
}
